package com.syg.rabbitmq.producer;


import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 路由模式需要声明Direct交换机
 * <br/>
 *
 * <img width="957px" height="455px" src="../../../../../resources/picture/路由模式.png" alt="路由模式需要声明Direct交换机">
 *     <br/>
 *     和发布订阅不同的是，队列绑定交换机时，需要指定一个routingKey。
 *     那么生产者发送消息时不仅需要指定交换机还需要指定routingKey。
 *     这样的话交换机就会把消息转发给跟自己绑定并且routingKey相匹配的队列。
 */
public class Routing_Producer {

    public static void main(String[] args) throws IOException, TimeoutException {

        // 1,创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();

        //2,设置参数
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setUsername("guest");
        factory.setPassword("guest");
        factory.setVirtualHost("/");

        // 3,创建连接
        Connection connection = factory.newConnection();
        // 4,创建Channel
        Channel channel = connection.createChannel();

        /*
         * exchangeDeclare(String exchange,BuiltinExchangeType type,boolean durable,boolean autoDelete,boolean internal,Map<String, Object> arguments)
         * 参数：
         *   exchange：交换机
         *   type：交换机类型
         *   durable:持久化
         *   autoDelete：自动删除
         *   internal：mq内部使用,一般false
         *   arguments：参数
         * */
        // 5,创建交换机
        String exchangeName = "test_direct";
        channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT, true, false, false, null);

        // 6,创建队列
        String queueDirect1 = "queueDirect1";
        String queueDirect2 = "queueDirect2";
        channel.queueDeclare(queueDirect1, true, false, false, null);
        channel.queueDeclare(queueDirect2, true, false, false, null);


        // Routing模式,需要指定routingKey
        channel.queueBind(queueDirect1, exchangeName, "error");
        // 队列2的绑定
        channel.queueBind(queueDirect2, exchangeName, "info");
        channel.queueBind(queueDirect2, exchangeName, "error");
        channel.queueBind(queueDirect2, exchangeName, "warning");

        // ------执行以上代码,管理台会看到队列与交换机-----------

        // 8,发送消息(fanout不需要声明路由key)
        String routingKey = "error";
        String content = "direct类型的交换机——Routing模式,需要指定routingKey=" + routingKey;
        channel.basicPublish(exchangeName, routingKey, null, content.getBytes());

        // 9,释放资源
    }
}
